home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
basic
/
qbnws104.zip
/
IQUEUE.ZIP
/
ISTACK.ASM
< prev
next >
Wrap
Assembly Source File
|
1990-05-21
|
3KB
|
94 lines
page ,132
title ISTACK - Add an integer "stack" to BC/QB
subttl Copyright 1990, Editing Services Co.
comment |
Implements an integer LIFO stack by adding five procedures to QB/BC:
two SUBs and three FUNCTIONs. See IQUEUE for a FIFO stack.
DECLARE SUB ISpush (ival%) 'put an item on the stack
DECLARE FUNCTION ISpop% () 'get an item off the stack
DECLARE FUNCTION ISfree% () 'TRUE if any room on stack
DECLARE FUNCTION ISavail% () 'TRUE if anything on stack
DECLARE SUB ISclear () 'clear the stack
|
page +
.model medium, basic
.data
ISP dw 0 ; DGROUP storage for stack pointer
.code
MaxISP equ 255 ; determines max items in stack
IStack dw (MaxISP + 1) dup (-1)
page +
Iperr:: INT 4 ; report an "Overflow" to QB/BC
ISpush PROC ival
; Accepts an integer value and places it onto our Integer Stack.
; Generates an Overflow Error in QB if there is no room on the stack.
mov bx, ival ; get pointer to passed value
mov ax, [bx] ; hold actual value
mov bx, ISP ; get the current Integer Stack Pointer
inc bx ; increment it first
cmp bx, MaxISP ; test against the allowed maximum depth
ja Iperr ; if stack already full, Overflow Error
mov ISP, bx ; otherwise, save new SP
shl bx, 1 ; turn SP into a word pointer
mov IStack[bx], ax ; place item on Integer Stack
ret
ISpush ENDP
ISpop PROC
; Removes the most recently pushed integer value from our stack.
; Generates an Overflow Error if there are no values on the stack.
mov bx, ISP ; get current Integer Stack Pointer
or bx, bx ; is it zero?
jz Iperr ; yes, stack is empty: Overflow error
shl bx, 1 ; turn ISP into a word pointer
mov ax, IStack[bx] ; retrieve value from stack
dec ISP ; decrement ISP
ret ; and return retrieved value
ISpop ENDP
page +
ISclear PROC
; "Clear" the stack by resetting our stack pointer to zero.
mov ISP, 0
ret
ISclear ENDP
ISfree PROC
; Returns TRUE if there is any space left in the stack.
xor ax, ax ; assume there's no room
cmp ISP, MaxISP ; set carry if room left
sbb ax, ax ; adjust result to -1 if room
ret
ISfree ENDP
ISavail PROC
; Returns TRUE if there are any data items on the stack
xor ax, ax ; assume no items present
cmp ax, ISP ; set carry if ISP non-zero
sbb ax, ax ; adjust result to TRUE if stack used
ret
ISavail ENDP
page +
end